在 SwiftUI 中,動畫效果可以大大提升用戶的體驗,使界面變得更具動態感和交互性。SwiftUI 提供了多種方法來創建和控制動畫效果。這裡介紹幾個常見的動畫使用方式:
你可以使用 .animation()
修飾符來對視圖的屬性進行動畫處理,當其值變化時,動畫會自動觸發。
struct SimpleAnimationView: View {
@State private var isExpanded = false
var body: some View {
VStack {
Rectangle()
.fill(Color.blue)
.frame(width: isExpanded ? 200 : 100, height: 100)
.animation(.default, value: isExpanded)
Button("Animate") {
isExpanded.toggle()
}
}
}
}
在這個範例中,當按鈕被點擊時,矩形的寬度會在兩個值之間變化,並伴隨動畫效果。
如果你想要更自然的動畫效果,可以使用彈性動畫,比如 .spring()
。
struct SpringAnimationView: View {
@State private var isExpanded = false
var body: some View {
VStack {
Circle()
.fill(Color.green)
.frame(width: isExpanded ? 200 : 100, height: 100)
.animation(.spring(response: 0.5, dampingFraction: 0.5), value: isExpanded)
Button("Animate") {
isExpanded.toggle()
}
}
}
}
這裡 .spring()
提供了一個彈性的動態效果,當按鈕被點擊後,圓形的大小會逐漸變大或縮小,並帶有彈跳的效果。
可以使用 .easeIn
、.easeOut
等選項來調整動畫的速度曲線,還可以設置自定義的動畫時間。
struct CustomDurationAnimationView: View {
@State private var isExpanded = false
var body: some View {
VStack {
RoundedRectangle(cornerRadius: 25)
.fill(Color.purple)
.frame(width: isExpanded ? 250 : 150, height: 150)
.animation(.easeInOut(duration: 2), value: isExpanded)
Button("Animate") {
isExpanded.toggle()
}
}
}
}
此例中,動畫會在 2 秒內緩慢展開或收縮,並且使用 .easeInOut
調整動畫的節奏,使其變得更加柔和。
動畫可以與狀態變化密切結合,當狀態值變化時,自動觸發動畫。
struct StateBasedAnimationView: View {
@State private var scale: CGFloat = 1.0
var body: some View {
VStack {
Image(systemName: "star.fill")
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: 100, height: 100)
.scaleEffect(scale)
.animation(.easeIn(duration: 0.5), value: scale)
Button("Scale Up") {
scale += 0.2
}
}
}
}
當點擊按鈕後,星星圖案會根據狀態變化進行縮放,並伴隨著一個平滑的動畫效果。
你可以使用 .repeatForever()
讓動畫無限重複,或 .repeatCount()
讓它重複特定次數。
struct RepeatingAnimationView: View {
@State private var rotate = false
var body: some View {
Image(systemName: "arrow.right.circle.fill")
.resizable()
.frame(width: 100, height: 100)
.rotationEffect(.degrees(rotate ? 360 : 0))
.animation(
Animation.linear(duration: 2)
.repeatForever(autoreverses: false),
value: rotate
)
.onAppear {
rotate = true
}
}
}
在這個範例中,圖像會不斷以 2 秒為週期進行旋轉。